package controllers;

import grafo.algoritmo.Grafo;
import grafo.estrutura.Aresta;
import grafo.estrutura.Vertice;

import java.util.ArrayList;
import java.util.List;

import models.Usuario;

import play.cache.Cache;
import play.mvc.Controller;

public class Carteiros extends Controller {
	public static void locaisECaminhos() {
		Usuario usuario = Usuario.find("byEmail", Security.connected()).first();
		Grafo g = Cache.get("carteiro", Grafo.class);
		if (g == null) {
			g = new Grafo(false);
			Cache.set("carteiro", g);
		}
		List<Vertice> vertices = new ArrayList<Vertice>();
		vertices = g.getVertices();

		List<Aresta> arestas = new ArrayList<Aresta>();
		arestas = g.getArestas();
		render(vertices, arestas);
	}

	public static void adicionarLocal() {
		Grafo g = Cache.get("carteiro", Grafo.class);
		int id = 0;
		if (g.getVertices() != null) {
			id = g.getVertices().size();
		}
		id += 1;
		g.adicionarVertice(id, params.get("descricao"));
		Cache.set("carteiro", g);
		Carteiros.locaisECaminhos();
	}

	public static void acharMelhorCaminho() {
		try {
			Grafo g = Cache.get("carteiro", Grafo.class);
			if (g.verificarGrafoEuleriano()) {
				Cache.set("carteiro", g);
				List<Vertice> melhorcaminho = new ArrayList<Vertice>();
				melhorcaminho = g.getCicloEuleriano();
				render(melhorcaminho);
			} else {
				flash.error("Não é euleriano, crie mais caminhos de forma que o grafo torne-se um grafo de Euler.");
				Carteiros.locaisECaminhos();
			}
		} catch (Exception ex) {
			flash.error("Não é euleriano, crie mais caminhos de forma que o grafo torne-se um grafo de Euler.");
			Carteiros.locaisECaminhos();
		}
	}

	public static void adicionarCaminho() {
		Grafo g = Cache.get("carteiro", Grafo.class);

		Vertice vOrigem = new Vertice();
		Vertice vDestino = new Vertice();
		for (Vertice v : g.getVertices()) {
			if (v.getID() == Integer.parseInt(params.get("idVOrigem"))) {
				vOrigem = v;
			}

			if (v.getID() == Integer.parseInt(params.get("idVDestino"))) {
				vDestino = v;
			}
		}

		int id = 0;
		if (g.getArestas() != null) {
			id = g.getArestas().size();
		}
		id += 1;
		g.adicionarAresta(id, params.get("descricao"), vOrigem, vDestino,
				Double.parseDouble(params.get("distancia")));
		Cache.set("carteiro", g);
		Carteiros.locaisECaminhos();
	}

	public static void removerLocal(int id) {
		try {
			Grafo g = Cache.get("carteiro", Grafo.class);
			List<Vertice> vertices = new ArrayList<Vertice>();
			vertices = g.getVertices();
			if (vertices.size() > 0)
				for (Vertice v : vertices) {
					if (v.getID() == id)
						g.removerVertice(v);
				}
			Cache.set("carteiro", g);
			Carteiros.locaisECaminhos();
		} catch (Exception ex) {
		
			Carteiros.locaisECaminhos();
		}
	}

	public static void removerCaminho(int id) {
		try {
			Grafo g = Cache.get("carteiro", Grafo.class);
			List<Aresta> arestas = new ArrayList<Aresta>();
			arestas = g.getArestas();
			if (arestas.size() >0)
				for (Aresta a : arestas) {
					if (a.getID() == id)
						g.removerAresta(a);
				}
			Cache.set("carteiro", g);
			Carteiros.locaisECaminhos();
		} catch (Exception ex) {
			
			Carteiros.locaisECaminhos();
		}
	}
}
